GitHubで複数種類のCI/CDサービスと連携時の必須ステータスチェックの動作を確認してみた
こんにちは、CX事業本部の若槻です。
GitHubにはrequired status checks(必須ステータスチェック)という、指定のCI/CDにPassした時にのみブランチに変更を加えられるようにするブランチ保護の設定があります。
Required status checks ensure that all required CI tests are passing before collaborators can make changes to a protected branch.
今回は、GitHubで複数種類のCI/CDサービスと連携したRepositoryのPull Requestではこの必須ステータスチェックがちゃんと動作するのか?を確認してみました。
確認してみた
以下の3種類のCI/CDサービスに連携済みのRepositoryで確認を行ってみます。BranchへのPushによりそれぞれのサービス上でCIが実行されるように連携設定済みとなります。
- GitHub Actions
- CircleCI
- Travis CI
参考までに、今回利用した各CI/CDサービスのコンフィグファイルは以下のようになります。
version: 2.1 orbs: python: circleci/[email protected] jobs: build-and-test: executor: python/default steps: - checkout - run: name: build and test command: | pip install pipenv pipenv sync make lint test-unit workflows: ci: jobs: - build-and-test
name: Workflow on: push: jobs: cicd: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.7 - name: Install dependencies run: | pip install pipenv pipenv sync - name: Lint and Test run: | make lint test-unit - name: Deploy to AWS if: github.ref == 'refs/heads/master' env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: ap-northeast-1 run: | make deploy
language: python python: - "3.7" install: - pip install pipenv - pipenv sync script: - make lint test-unit
Branchの必須ステータスチェックを有効化
事前の設定として、Branchの必須ステータスチェックを有効化して、すべてのCI/CDサービスでのCI/CDがPassした時のみPull Requestからmaster
BranchへのMergeが可能となるようにするブランチ保護ルールを作成します。
Repositoryの[Settings]タブ - [Branches] - [Branch protection rules]で[Add rule]をクリックします。
[Branch name patter]でmaster
を入力します。
[Require status checks to pass before merging]および[Require branches to be up to date before merging]にチェックを入れ、必須条件とさせたいCI/CDの実行にチェック入れます。[Save changes]をクリックします。
master
Branchに対するブランチ保護ルールを作成できました。
必須ステータスチェックの動作の確認
必須ステータスチェックの動作を確認していきます。
まず、いずれかのCI/CDが失敗するCommitの場合です。
作業用BranchでのCommitをPushしたら、master
BranchへのMergeを行うPull Requestでの各CI/CDサービスのステータスが実行中となります。
実行が完了し、GitHub ActionsとTravis CIがPass、CircleCIがFailという結果となりました。この状態だと[Merge pull request]をクリックしても、
一部のCI/CDがFailしているためmaster
RepositoryへのMergeができず、[Confirm merge]ボタンも押せません。
次に、すべてのCI/CDがPassするCommitの場合です。
CommitをPushすると同Pull RequestですべてのCI/CDが実行中のステータスとなった後に、
すべてのCI/CDがPassしてAll checks have passed
となり[Merge pull request]がクリック可能となりました。クリックしてみます。
Merge可能となったので[Confirm merge]もクリック可能となっています。
おわりに
GitHubで複数種類のCI/CDサービスと連携したRepositoryのPull Requestでの必須ステータスチェックの動作を確認してみました。
複数種類のCI/CDサービスと連携した場合でも、必須ステータスチェックの機能は1種類の場合と同じように使用できることが分かりました。
必須ステータスチェックやブランチ保護の設定は既定では無効となっているので今後は積極的に有効化して活用していきたいです。
参考
- Defining the mergeability of pull requests - GitHub Help
- Protected Branches機能で柔軟なワークフローを構築する - Think IT
以上